package zdream.control.foe.mm;

import zdream.control.world.MFoe;
import zdream.control.world.buff.HealthModule;

/**
 * <p>洛克的飞狗, 洛克专属宠物, 属于道具类.
 * <p>飞狗大小是, 长 1b, 高 0.4b 左右, 锚点在方块上边的中点.
 *
 * <p>这里的飞狗做如下优化:
 * <li>飞狗移动速度同走路速度;
 * <li>飞狗扣能量的时机, 当洛克站在上面开始扣, 当超过 1.5 秒洛克不在上面停止扣能量;
 * 扣能量为每秒消耗 6% 能量 (满能量的飞狗可使用 16.7 秒)
 * <li>开始左右移动, 左右移动无法停止; 上下可操作, 类似洛克人 5 代;
 * <li>到中继点时, 飞狗能量低于 50% 的话补充到 50%;
 * <li>左右移动可以冲刺, 冲刺时上下移动速度为 0, 三倍消耗能量, 速度略高于滑铲 (9 格 / 秒);
 * 冲刺最长时长不限, 但至少 0.5 秒
 * <li>撞墙飞狗不会消失; 不怕子弹; 撞刺之后暂停 0.5 秒后立刻消失动画;
 * <li>飞狗不使用时 5 秒后缓慢恢复能量, 每秒恢复 0.5%;
 * <li>飞狗和跳狗能量算在一起, 人狗合一的能量槽单独计算;
 * <li>飞狗是平台方块, 上下穿透, 只能在上方站人, 只能站洛克同阵营的人, 但只有洛克能操作飞狗;
 * 站在上面的洛克的位置固定在飞狗的锚点上, 如果刚跳上飞狗的位置和锚点有偏差,
 * 有 24 步（0.2 秒）的时间移到正确位置; 洛克在飞狗上无法行走,
 * 而跳跃或站在飞狗上再按一次飞狗道具键能主动离开飞狗;
 * 在飞狗上洛克受伤不影响飞狗速度, 不影响上下移动, 不影响飞狗冲刺;
 * <li>如果洛克不是站在飞狗上, 而飞狗已经被召唤在世界上, 再按一次飞狗道具键是收回飞狗;
 * 如果是跳狗在世界上, 则跳狗收回后再进行召唤飞狗, 这样耗时会较长;
 * <li>洛克在飞狗上直接按跳狗道具键, 可允许洛克直接在飞狗上起跳离开飞狗, 且飞狗变成跳狗坠落;
 * <li>当飞狗离洛克的距离大于 20b 时 (按横坐标和纵坐标的差的和作为距离), 或者房间外且洛克不站在上面,
 * 则进入“即将回收”的状态, 此时飞狗会白闪.
 * 如果 1 秒内洛克没有靠近到 12b 以内时, 飞狗回收.
 * </li></p>
 *
 * @author Zdream
 * @since 0.0.1
 * @date 2021-08-07 (created)
 * @date 2022-06-03 (last modified)
 */
public class RushJet extends MFoe {
	public static final String NAME = "MegaManRushJet";
	public final RushJetProp owner;

	public RushJet(RushJetProp owner) {
		super(owner.owner.world);
		this.owner = owner;
		this.type = TYPE_TRAP;
		this.side = owner.owner.side;
	}

	@Override
	public String foeName() {
		return NAME;
	}

	@Override
	public void init() {
		createNormalPattern()
				.withRectangle(-0.708f, -0.4f, 1.417f, 0.4f)
				.apply();
		healthModule = buildHealthModule()
				.outsideDestroyThreshold(1000)
				.create();
		addBuff(motionModule = new RushJetMotionModule(this));

//		putPainter(painter = new RushJetPainter(this));
	}

//	public RushJetPainter painter;

	public HealthModule healthModule;
	public RushJetMotionModule motionModule;

	@Override
	public void submitMotion(float deltaX, float deltaY) {
		terrainHandler.submitMotion(this, deltaX, deltaY);
	}
}
